const defaultRE = /\{\{((?:.|\r?\n)+?)\}\}/g
export const util = {
    compilerText(node,vm) {
        node.textContent = node.textContent.replace(defaultRE, function (...args) {
            return util.getValue(vm, args[1]); // 有可能是这样的→{{school.name}} 那么返回的即是vm.school.name, 否则就是vm.x
        });
        /* 注意:
            如果textContent要被赋的值非字符串 就会先执行`.toString`↓↓
            document.querySelector('.test').textContent = [1, 2, 3];
        */
    },
    getValue(vm, expr) { // school.name
        const keys = expr.split('.');
        return keys.reduce((memo, current) => {
            memo = memo[current]; // memo = vm.school
            return memo;
        },vm);
    }
};

export function compiler(node, vm) {
    const childNodes = node.childNodes; // 一层
    [...childNodes].forEach(child => { // 1.元素 2.文本
        if(child.nodeType === 1) { // 元素
            compiler(child,vm); // 递归
        }else if (child.nodeType === 3){ // 文本
            util.compilerText(child, vm);
        }
    });
}

export function query(el){
    if (typeof el === 'string') {
        return document.querySelector(el);
    }
    // 说明直接传的就是一个dom元素↓
    return el;
}